package model

import (
	"encoding/json"
	"fmt"
	"chatroom/common/message"
	"github.com/garyburd/redigo/redis"
)

//我们在服务器启动后就初始化一个 userDao 实例，
//把它做成全局变量，在需要和 redis 操作时，直接使用即可
var (
	MyUserDao *UserDao

)

//定义一个UserDao 结构体
//完成对User 结构体的各种操作

type UserDao struct {
	pool *redis.Pool
}

//使用工厂模式，创建 UserDao 实例
func NewUserDao(pool *redis.Pool) (userDao *UserDao) {

	userDao = &UserDao{
		pool:pool,
	}
	return
}

//思考在UesrDao 应该提供那些方法给我们
//1.根据用户 id 返回应该User 实例 ＋ err
func (ud *UserDao) getUserById(conn redis.Conn, id int) (user *User, err error) {

	//提供给定的id 去 redis 查询用户
	res, err := redis.String(conn.Do("hget", "users", id))
	if err != nil {
		//错误
		if err == redis.ErrNil { //表示在 users 哈希中，没有找到对应得id
			err = ERROR_USER_NOTEXISTS
		}
		return
	}

	user = &User{}

	//这里需要把 res 反序列化为User实例
	err = json.Unmarshal([]byte(res), user)
	if err != nil {
		fmt.Println("jaon.Umarshal err=", err)
	}
	return
}

//完成登录得校验
//1. Login 完成对用户得验证
//2.如果用户得id 和pwd都正确，则返回一个user实例
//3.如果 用户的 id 或 pwd 有错误，则返回对应的错误信息
func (ud *UserDao) Login(userId int, userPwd string) (user *User, err error) {

	//先从 UserDao 的链接池中取出一个连接
	conn := ud.pool.Get()
	defer conn.Close()
	user, err = ud.getUserById(conn, userId)
	if err != nil {
		return
	}

	//证明用户获取到，
	if user.UserPwd != userPwd {
		err = ERROR_USER_PWD
		return
	}
	return
}

func (ud *UserDao) Register(user *message.User) (err error) {
	
		//先从 UserDao 的链接池中取出一个连接
		conn := ud.pool.Get()
		defer conn.Close()
		_, err = ud.getUserById(conn, user.UserId)
		if err == nil { //用户存在
			err = ERROR_USER_EXISTS
			return
		}

		//这是，说明id 在 redis 还没有，可以完成注册
		data, err :=json.Marshal(user) //序列化
		if err != nil {
			return
		}

		//入库
		_, err = conn.Do("hset","users",user.UserId,string(data))
		if err != nil {
			fmt.Println("保存注册用户错误 err=",err)
			return
		}

		return
}
